import axios from 'axios'
import { useUserStore } from '@/stores/user'
import { showToast } from 'vant'

// 创建axios实例
const service = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
    timeout: 10000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json;charset=utf-8',
    },
})

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么
        const userStore = useUserStore()

        // 如果token存在，添加到请求头
        if (userStore.token) {
            config.headers.Authorization = `Bearer ${userStore.token}`
        }

        // 添加语言头
        config.headers['Accept-Language'] = userStore.currentLocale

        return config
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        // 对响应数据做点什么

        // 如果返回的是文件流，直接返回
        if (response.config.responseType === 'blob') {
            return response.data
        }

        // 根据后端返回的数据结构进行调整
        const res = response.data

        // 假设我们的后端返回结构为 { code: 0, data: {}, message: 'success' }
        if (res.code === 0) {
            return res.data
        } else {
            // 非成功状态，显示错误消息
            showToast(res.message || 'Error')
            return Promise.reject(new Error(res.message || 'Error'))
        }
    },
    (error) => {
        // 对响应错误做点什么
        let message = error.message

        if (error.response) {
            // 有响应，但是状态码不在2xx范围内
            switch (error.response.status) {
                case 401:
                    message = '未授权，请登录'
                    // 可以在这里触发登出操作
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = `请求地址出错: ${error.response.config.url}`
                    break
                case 500:
                    message = '服务器内部错误'
                    break
                default:
                    message = `网络错误 (${error.response.status})`
            }
        } else if (error.request) {
            // 请求没有响应
            message = '网络连接异常，请检查网络'
        }

        showToast(message)
        return Promise.reject(error)
    }
)

export default service